#include<iostream>
#include<unistd.h>

enum 
{
    PIPE_ERROR=1,
    FORK_ERROR,
    WRITE_ERROR
};


//父读子写
int main()
{
    int pipefd[2]={0};

    int n=pipe(pipefd);
    if(n==-1)
    {
        std::cerr<<"pipe(pipefd):"<<std::endl;
        return PIPE_ERROR;
    }

    pid_t fd=fork();
    if(fd==-1)
    {
        std::cerr<<"fork():"<<std::endl;
        return FORK_ERROR;
    }

    //父读子写
    if(fd==0)
    {
        ::close(pipefd[0]);
        std::string buf="hello pipe";
        int count=0;
        while(true)
        {
            std::cout<<"子进程写入的内容为:"<<buf<<count<<std::endl;
            std::string tmp=buf+std::to_string(count++);
            int n=write(pipefd[1],tmp.c_str(),tmp.size());
    
            if(n==-1)
            {
                std::cerr<<"write(pipefd[1],tmp.c_str(),tmp.size());"<<std::endl;
                return WRITE_ERROR;
            }
            else if(n!=tmp.size())
            {
                std::cerr<<"写入个数少于字符串"<<std::endl;
                return WRITE_ERROR;
            }
    
            sleep(1);
        }
    
        exit(0);
    }


    char buf[1024];
    ::close(pipefd[1]);
    while(true)
    {
        int n=::read(pipefd[0],buf,sizeof(buf)-1);//给\0留位置
        if(n==0)
        {
            std::cout<<"写段关闭"<<std::endl;
        }
        buf[n]='\0';

        std::cout<<"父进程读取的内容为:"<<buf<<std::endl;
        sleep(1);
    }

    return 0;
}


//父写子读
// int main()
// {
//     int pipefd[2]={0};

//     int n=pipe(pipefd);
//     if(n==-1)
//     {
//         std::cerr<<"pipe(pipefd):"<<std::endl;
//         return PIPE_ERROR;
//     }

//     pid_t fd=fork();
//     if(fd==-1)
//     {
//         std::cerr<<"fork():"<<std::endl;
//         return FORK_ERROR;
//     }


//     //子进程读，父进程写
//     if(fd==0)
//     {
//         char buf[1024];
//         //child
//         ::close(pipefd[1]);
//         while(true)
//         {
//             int n=::read(pipefd[0],buf,sizeof(buf)-1);//给\0留位置
//             if(n==0)
//             {
//                 std::cout<<"写段关闭"<<std::endl;
//             }
//             buf[n]='\0';

//             std::cout<<"子进程读取的内容为:"<<buf<<std::endl;
//             sleep(2);
//         }

//         exit(0);
//     }

//     //father
//     ::close(pipefd[0]);
//     std::string buf="hello pipe";
//     int count=0;
//     while(true)
//     {
//         std::cout<<"父进程写入的内容为:"<<buf<<count<<std::endl;
//         std::string tmp=buf+std::to_string(count++);
//         int n=write(pipefd[1],tmp.c_str(),tmp.size());

//         if(n==-1)
//         {
//             std::cerr<<"write(pipefd[1],tmp.c_str(),tmp.size());"<<std::endl;
//             return WRITE_ERROR;
//         }
//         else if(n!=tmp.size())
//         {
//             std::cerr<<"写入个数少于字符串"<<std::endl;
//             return WRITE_ERROR;
//         }

//         sleep(1);
//     }

//     return 0;
// }


